/**
 * 【20150505胡砥峰】修改01_parser.js.去除easyloader的写法,设定所有组件自动解析.
 */
(function($) {
	$.parser = {
		onComplete : function(context) {
		},
		
		// 需要被解析的组件
		plugins : [ 'draggable', 'droppable', 'resizable', 'pagination', 'tooltip', 'linkbutton', 'menu', 'menubutton', 'splitbutton', 'progressbar', 'tree', 'textbox', 'filebox', 'combo', 'combobox', 'combotree', 'combogrid', 'numberbox',
				'validatebox', 'searchbox', 'spinner', 'numberspinner', 'timespinner', 'datetimespinner', 'calendar', 'datebox', 'datetimebox', 'slider', 'layout', 'panel', 'datagrid', 'propertygrid', 'treegrid', 'datalist', 'tabs', 'accordion',
				'window', 'dialog', 'form', 'chart' ],
				
		// 解析ui组件【20150505胡砥峰】
		parse : function(context) {
			var startTime = $.now();// 解析开始时间,开发时记录控件的解析时间
			
			for (var i = 0; i < $.parser.plugins.length; i++) {
				var name = $.parser.plugins[i];// 组件名称
				var r = $('.easyui-' + name, context);// 查找class为powerui-组件名的jq对象,例如,powerui-datagrid
				if (r.length && r[name]) {
					// 如果有,直接调用这个plugin的自执行方法,比如:$.fn.linkbutton = function(options, param) {……}
					r[name]();
					
					// 记录解析日志,调试的时候用
					var endTime = $.now();// 解析结束时间
					//Log.info("解析组件[" + name + "]", endTime - startTime);
					startTime = endTime;
				}
			}
			
			$.parser.onComplete.call($.parser, context);// 控件解析完毕调用onComplete方法
		},

		parseValue : function(property, value, parent, delta) {
			delta = delta || 0;
			var v = $.trim(String(value || ''));
			var endchar = v.substr(v.length - 1, 1);
			if (endchar == '%') {
				v = parseInt(v.substr(0, v.length - 1));
				if (property.toLowerCase().indexOf('width') >= 0) {
					v = Math.floor((parent.width() - delta) * v / 100.0);
				} else {
					v = Math.floor((parent.height() - delta) * v / 100.0);
				}
			} else {
				v = parseInt(v) || undefined;
			}
			return v;
		},

		/**
		 * 解析并返回powerui组件的属性值,支持html5的'data-options'写法.
		 * 
		 * parse options, including standard 'data-options' attribute.
		 * 
		 * calling examples: $.parser.parseOptions(target); $.parser.parseOptions(target, ['id','title','width',{fit:'boolean',border:'boolean'},{min:'number'}]);
		 */
		parseOptions : function(target, properties) {
			var t = $(target);
			var options = {};

			var s = $.trim(t.attr('data-options'));
			if (s) {
				if (s.substring(0, 1) != '{') {
					s = '{' + s + '}';
				}
				options = (new Function('return ' + s))();
			}
			$.map([ 'width', 'height', 'left', 'top', 'minWidth', 'maxWidth', 'minHeight', 'maxHeight' ], function(p) {
				var pv = $.trim(target.style[p] || '');
				if (pv) {
					if (pv.indexOf('%') == -1) {
						pv = parseInt(pv) || undefined;
					}
					options[p] = pv;
				}
			});

			if (properties) {
				var opts = {};
				for (var i = 0; i < properties.length; i++) {
					var pp = properties[i];
					if (typeof pp == 'string') {
						opts[pp] = t.attr(pp);
					} else {
						for ( var name in pp) {
							var type = pp[name];
							if (type == 'boolean') {
								opts[name] = t.attr(name) ? (t.attr(name) == 'true') : undefined;
							} else if (type == 'number') {
								opts[name] = t.attr(name) == '0' ? 0 : parseFloat(t.attr(name)) || undefined;
							}
						}
					}
				}
				$.extend(options, opts);
			}
			return options;
		}
	};
	
	/**
	 * 每个页面加载完都会执行此方法.是$(document).ready(function(){ })的简写方式
	 */
	$(function() {
		$.parser.parse();// 解析页面上所有的组件,【20150505胡砥峰】
	});

	/**
	 * extend plugin to set box model width
	 */
	$.fn._outerWidth = function(width) {
		if (width == undefined) {
			if (this[0] == window) {
				return this.width() || document.body.clientWidth;
			}
			return this.outerWidth() || 0;
		}
		return this._size('width', width);
	};

	/**
	 * extend plugin to set box model height
	 */
	$.fn._outerHeight = function(height) {
		if (height == undefined) {
			if (this[0] == window) {
				return this.height() || document.body.clientHeight;
			}
			return this.outerHeight() || 0;
		}
		return this._size('height', height);
	};

	$.fn._scrollLeft = function(left) {
		if (left == undefined) {
			return this.scrollLeft();
		} else {
			return this.each(function() {
				$(this).scrollLeft(left)
			});
		}
	};

	$.fn._propAttr = $.fn.prop || $.fn.attr;

	$.fn._size = function(options, parent) {
		if (typeof options == 'string') {
			if (options == 'clear') {
				return this.each(function() {
					$(this).css({
						width : '',
						minWidth : '',
						maxWidth : '',
						height : '',
						minHeight : '',
						maxHeight : ''
					});
				});
			} else if (options == 'fit') {
				return this.each(function() {
					_fit(this, this.tagName == 'BODY' ? $('body') : $(this).parent(), true);
				});
			} else if (options == 'unfit') {
				return this.each(function() {
					_fit(this, $(this).parent(), false);
				});
			} else {
				if (parent == undefined) {
					return _css(this[0], options);
				} else {
					return this.each(function() {
						_css(this, options, parent);
					});
				}
			}
		} else {
			return this.each(function() {
				parent = parent || $(this).parent();
				$.extend(options, _fit(this, parent, options.fit) || {});
				var r1 = _setSize(this, 'width', parent, options);
				var r2 = _setSize(this, 'height', parent, options);
				if (r1 || r2) {
					$(this).addClass('powerui-fluid');
				} else {
					$(this).removeClass('powerui-fluid');
				}
			});
		}

		function _fit(target, parent, fit) {
			if (!parent.length) {
				return false;
			}
			var t = $(target)[0];
			var p = parent[0];
			var fcount = p.fcount || 0;
			if (fit) {
				if (!t.fitted) {
					t.fitted = true;
					p.fcount = fcount + 1;
					$(p).addClass('panel-noscroll');
					if (p.tagName == 'BODY') {
						$('html').addClass('panel-fit');
					}
				}
				return {
					width : ($(p).width() || 1),
					height : ($(p).height() || 1)
				};
			} else {
				if (t.fitted) {
					t.fitted = false;
					p.fcount = fcount - 1;
					if (p.fcount == 0) {
						$(p).removeClass('panel-noscroll');
						if (p.tagName == 'BODY') {
							$('html').removeClass('panel-fit');
						}
					}
				}
				return false;
			}
		}
		function _setSize(target, property, parent, options) {
			var t = $(target);
			var p = property;
			var p1 = p.substr(0, 1).toUpperCase() + p.substr(1);
			var min = $.parser.parseValue('min' + p1, options['min' + p1], parent);// || 0;
			var max = $.parser.parseValue('max' + p1, options['max' + p1], parent);// || 99999;
			var val = $.parser.parseValue(p, options[p], parent);
			var fluid = (String(options[p] || '').indexOf('%') >= 0 ? true : false);

			if (!isNaN(val)) {
				var v = Math.min(Math.max(val, min || 0), max || 99999);
				if (!fluid) {
					options[p] = v;
				}
				t._size('min' + p1, '');
				t._size('max' + p1, '');
				t._size(p, v);
			} else {
				t._size(p, '');
				t._size('min' + p1, min);
				t._size('max' + p1, max);
			}
			return fluid || options.fit;
		}
		function _css(target, property, value) {
			var t = $(target);
			if (value == undefined) {
				value = parseInt(target.style[property]);
				if (isNaN(value)) {
					return undefined;
				}
				if ($._boxModel) {
					value += getDeltaSize();
				}
				return value;
			} else if (value === '') {
				t.css(property, '');
			} else {
				if ($._boxModel) {
					value -= getDeltaSize();
					if (value < 0) {
						value = 0;
					}
				}
				t.css(property, value + 'px');
			}
			function getDeltaSize() {
				if (property.toLowerCase().indexOf('width') >= 0) {
					return t.outerWidth() - t.width();
				} else {
					return t.outerHeight() - t.height();
				}
			}
		}
	};

})(jQuery);

/**
 * support for mobile devices
 */
(function($) {
	var longTouchTimer = null;
	var dblTouchTimer = null;
	var isDblClick = false;

	function onTouchStart(e) {
		if (e.touches.length != 1) {
			return
		}
		if (!isDblClick) {
			isDblClick = true;
			dblClickTimer = setTimeout(function() {
				isDblClick = false;
			}, 500);
		} else {
			clearTimeout(dblClickTimer);
			isDblClick = false;
			fire(e, 'dblclick');
			// e.preventDefault();
		}
		longTouchTimer = setTimeout(function() {
			fire(e, 'contextmenu', 3);
		}, 1000);
		fire(e, 'mousedown');
		if ($.fn.draggable.isDragging || $.fn.resizable.isResizing) {
			e.preventDefault();
		}
	}
	function onTouchMove(e) {
		if (e.touches.length != 1) {
			return
		}
		if (longTouchTimer) {
			clearTimeout(longTouchTimer);
		}
		fire(e, 'mousemove');
		if ($.fn.draggable.isDragging || $.fn.resizable.isResizing) {
			e.preventDefault();
		}
	}
	function onTouchEnd(e) {
		// if (e.touches.length > 0){return}
		if (longTouchTimer) {
			clearTimeout(longTouchTimer);
		}
		fire(e, 'mouseup');
		if ($.fn.draggable.isDragging || $.fn.resizable.isResizing) {
			e.preventDefault();
		}
	}

	function fire(e, name, which) {
		var event = new $.Event(name);
		event.pageX = e.changedTouches[0].pageX;
		event.pageY = e.changedTouches[0].pageY;
		event.which = which || 1;
		$(e.target).trigger(event);
	}

	if (document.addEventListener) {
		document.addEventListener("touchstart", onTouchStart, true);
		document.addEventListener("touchmove", onTouchMove, true);
		document.addEventListener("touchend", onTouchEnd, true);
	}
})(jQuery);
